home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / assembler / progasm1.lha / SORGENTI2 / LEZIONE5d2.s < prev    next >
Text File  |  1994-07-06  |  7KB  |  240 lines

  1.  
  2. ; Lezione5d2.s    SCORRIMENTO DI UNA FIGURA IN ALTO E IN BASSO MODIFICANDO I
  3. ;        PUNTATORI AI PITPLANES NELLA COPPERLIST + EFFETTO DISTORSIONE
  4. ;        OTTENUTO CON I $dff102 (bplcon1)
  5.  
  6.     SECTION    CiriCop,CODE
  7.  
  8. Inizio:
  9.     move.l    4.w,a6        ; Execbase in a6
  10.     jsr    -$78(a6)    ; Disable - ferma il multitasking
  11.     lea    GfxName(PC),a1    ; Indirizzo del nome della lib da aprire in a1
  12.     jsr    -$198(a6)    ; OpenLibrary
  13.     move.l    d0,GfxBase    ; salvo l'indirizzo base GFX in GfxBase
  14.     move.l    d0,a6
  15.     move.l    $26(a6),OldCop    ; salviamo l'indirizzo della copperlist vecchia
  16.  
  17. ;     PUNTIAMO I NOSTRI BITPLANES
  18.  
  19.     MOVE.L    #PIC,d0        ; in d0 mettiamo l'indirizzo della PIC,
  20.     LEA    BPLPOINTERS,A1    ; puntatori nella COPPERLIST
  21.     MOVEQ    #2,D1        ; numero di bitplanes -1 (qua sono 3)
  22. POINTBP:
  23.     move.w    d0,6(a1)    ; copia la word BASSA dell'indirizzo del plane
  24.     swap    d0        ; scambia le 2 word di d0 (es: 1234 > 3412)
  25.     move.w    d0,2(a1)    ; copia la word ALTA dell'indirizzo del plane
  26.     swap    d0        ; scambia le 2 word di d0 (es: 3412 > 1234)
  27.     ADD.L    #40*256,d0    ; + lunghezza bitplane -> prossimo bitplane
  28.     addq.w    #8,a1        ; andiamo ai prossimi bplpointers nella COP
  29.     dbra    d1,POINTBP    ; Rifai D1 volte POINTBP (D1=num of bitplanes)
  30. ;
  31.     move.l    #COPPERLIST,$dff080    ; Puntiamo la nostra COP
  32.     move.w    d0,$dff088        ; Facciamo partire la COP
  33.     move.w    #0,$dff1fc        ; Disattiva l'AGA
  34.     move.w    #$c00,$dff106        ; Disattiva l'AGA
  35.  
  36. mouse:
  37.     cmpi.b    #$ff,$dff006    ; Siamo alla linea 255?
  38.     bne.s    mouse        ; Se non ancora, non andare avanti
  39.  
  40.     btst    #2,$dff016    ; se il tasto destro e' premuto salta
  41.     beq.s    Aspetta        ; la routine dello scroll, bloccandolo
  42.  
  43.  
  44.     bsr.w    MuoviCopper    ; fa scorrere la figura in alto e in basso
  45.                 ; di una linea alla volta cambiando i
  46.                 ; puntatori ai bitplanes in copperlist
  47.  
  48. Aspetta:
  49.     cmpi.b    #$ff,$dff006    ; Siamo alla linea 255?
  50.     beq.s    Aspetta        ; Se si, non andare avanti, aspetta!
  51.  
  52.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  53.     bne.s    mouse        ; se no, torna a mouse:
  54.  
  55.     move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  56.     move.w    d0,$dff088        ; facciamo partire la vecchia cop
  57.  
  58.     move.l    4.w,a6
  59.     jsr    -$7e(a6)    ; Enable - riabilita il Multitasking
  60.     move.l    gfxbase(PC),a1    ; Base della libreria da chiudere
  61.     jsr    -$19e(a6)    ; Closelibrary - chiudo la graphics lib
  62.     rts            ; USCITA DAL PROGRAMMA
  63.  
  64. ;    Dati
  65.  
  66. GfxName:
  67.     dc.b    "graphics.library",0,0    
  68.  
  69. GfxBase:        ; Qua ci va l'indirizzo di base per gli Offset
  70.     dc.l    0    ; della graphics.library
  71.  
  72. OldCop:            ; Qua ci va l'indirizzo della vecchia COP di sistema
  73.     dc.l    0
  74.  
  75.  
  76. ;    Questa routine sposta la figura in alto e in basso, agendo sui
  77. ;    puntatori ai bitplanes in copperlist (tramite la label BPLPOINTERS)
  78. ;    La struttura e' simile a quella di Lezione3d.s
  79.  
  80. MuoviCopper:
  81.     LEA    BPLPOINTERS,A1    ; Con queste 4 istruzioni preleviamo dalla
  82.     move.w    2(a1),d0    ; copperlist l'indirizzo dove sta puntando
  83.     swap    d0        ; attualmente il $dff0e0 e lo poniamo
  84.     move.w    6(a1),d0    ; in d0 - il contrario della routine che
  85.                 ; punta i bitplanes! Qua invece di mettere
  86.                 ; l'indirizzo lo prendiamo!!!
  87.  
  88.     TST.B    SuGiu        ; Dobbiamo salire o scendere? se SuGiu e'
  89.                 ; azzerata, (cioe' il TST verifica il BEQ)
  90.                 ; allora saltiamo a VAIGIU, se invece e' a $FF
  91.                 ; (se cioe' questo TST non e' verificato)
  92.                 ; continuiamo salendo (facendo dei sub)
  93.     beq.w    VAIGIU
  94.     cmp.l    #PIC-(40*30),d0    ; siamo arrivati abbastanza in BASSO?
  95.     beq.s    MettiGiu    ; se si, siamo in fondo e dobbiamo risalire
  96.     sub.l    #40,d0        ; sottraiamo 40, ossia 1 linea, facendo
  97.                 ; scorrere in BASSO la figura
  98.     bra.s    Finito
  99.  
  100. MettiGiu:
  101.     clr.b    SuGiu        ; Azzerando SuGiu, al TST.B SuGiu il BEQ
  102.     bra.s    Finito        ; fara' saltare alla routine VAIGIU
  103.  
  104. VAIGIU:
  105.     cmpi.l    #PIC+(40*30),d0    ; siamo arrivati abbastanza in ALTO?
  106.     beq.s    MettiSu        ; se si, siamo in fondo e dobbiamo risalire
  107.     add.l    #40,d0        ; Aggiungiamo 40, ossia 1 linea, facendo
  108.                 ; scorrere in ALTO la figura
  109.     bra.s    finito
  110.  
  111. MettiSu:
  112.     move.b    #$ff,SuGiu    ; Quando la label SuGiu non e' a zero,
  113.     rts            ; significa che dobbiamo risalire.
  114.  
  115. Finito:                ; PUNTIAMO I PUNTATORI BITPLANES
  116.     LEA    BPLPOINTERS,A1    ; puntatori nella COPPERLIST
  117.     MOVEQ    #2,D1        ; numero di bitplanes -1 (qua sono 3)
  118. POINTBP2:
  119.     move.w    d0,6(a1)    ; copia la word BASSA dell'indirizzo del plane
  120.     swap    d0        ; scambia le 2 word di d0 (es: 1234 > 3412)
  121.     move.w    d0,2(a1)    ; copia la word ALTA dell'indirizzo del plane
  122.     swap    d0        ; scambia le 2 word di d0 (es: 3412 > 1234)
  123.     ADD.L    #40*256,d0    ; + lunghezza bitplane -> prossimo bitplane
  124.     addq.w    #8,a1        ; andiamo ai prossimi bplpointers nella COP
  125.     dbra    d1,POINTBP2    ; Rifai D1 volte POINTBP (D1=num of bitplanes)
  126.     rts
  127.  
  128.  
  129. ;    Questo byte, indicato dalla label SuGiu, e' un FLAG.
  130.  
  131. SuGiu:
  132.     dc.b    0,0
  133.  
  134.  
  135.     SECTION    GRAPHIC,DATA_C
  136.  
  137. COPPERLIST:
  138.     dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000 ; SPRITE
  139.     dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  140.     dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  141.     dc.w    $13e,$0000
  142.  
  143.     dc.w    $8e,$2c81    ; DiwStrt    (registri con valori normali)
  144.     dc.w    $90,$2cc1    ; DiwStop
  145.     dc.w    $92,$0038    ; DdfStart
  146.     dc.w    $94,$00d0    ; DdfStop
  147.     dc.w    $102,0        ; BplCon1
  148.     dc.w    $104,0        ; BplCon2
  149.     dc.w    $108,0        ; Bpl1Mod
  150.     dc.w    $10a,0        ; Bpl2Mod
  151.  
  152.             ; 5432109876543210
  153.     dc.w    $100,%0011001000000000    ; bits 13 e 12 accesi!! (3 = %011)
  154.                     ; 3 bitplanes lowres, non lace
  155. BPLPOINTERS:
  156.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  157.     dc.w $e4,$0000,$e6,$0000    ;secondo bitplane
  158.     dc.w $e8,$0000,$ea,$0000    ;terzo     bitplane
  159.  
  160.     dc.w    $0180,$000    ; color0
  161.     dc.w    $0182,$475    ; color1
  162.     dc.w    $0184,$fff    ; color2
  163.     dc.w    $0186,$ccc    ; color3
  164.     dc.w    $0188,$999    ; color4
  165.     dc.w    $018a,$232    ; color5
  166.     dc.w    $018c,$777    ; color6
  167.     dc.w    $018e,$444    ; color7
  168.  
  169. ;    EFFETTO SPECCHIO (che si potrebbe vendere per effetto "texturemap")
  170.  
  171.     dc.w    $7007,$fffe
  172.     dc.w    $180,$004    ; Color0
  173.     dc.w    $102,$011    ; bplcon1
  174.     dc.w    $7307,$fffe
  175.     dc.w    $180,$006    ; Color0
  176.     dc.w    $102,$022    ; bplcon1
  177.     dc.w    $7607,$fffe
  178.     dc.w    $180,$008    ; Color0
  179.     dc.w    $102,$033    ; bplcon1
  180.     dc.w    $7b07,$fffe
  181.     dc.w    $180,$00a    ; Color0
  182.     dc.w    $102,$044    ; bplcon1
  183.     dc.w    $8307,$fffe
  184.     dc.w    $180,$00c    ; Color0
  185.     dc.w    $102,$055    ; bplcon1
  186.     dc.w    $9007,$fffe
  187.     dc.w    $180,$00e    ; Color0
  188.     dc.w    $102,$066    ; bplcon1
  189.     dc.w    $9607,$fffe
  190.     dc.w    $180,$00f    ; Color0
  191.     dc.w    $102,$077    ; bplcon1
  192.     dc.w    $9a07,$fffe
  193.     dc.w    $180,$00e    ; Color0
  194.     dc.w    $a007,$fffe
  195.     dc.w    $180,$00c    ; Color0
  196.     dc.w    $102,$066    ; bplcon1
  197.     dc.w    $ad07,$fffe
  198.     dc.w    $180,$00a    ; Color0
  199.     dc.w    $102,$055    ; bplcon1
  200.     dc.w    $b507,$fffe
  201.     dc.w    $180,$008    ; Color0
  202.     dc.w    $102,$044    ; bplcon1
  203.     dc.w    $ba07,$fffe
  204.     dc.w    $180,$006    ; Color0
  205.     dc.w    $102,$033    ; bplcon1
  206.     dc.w    $bd07,$fffe
  207.     dc.w    $180,$004    ; Color0
  208.     dc.w    $102,$022    ; bplcon1
  209.     dc.w    $bf07,$fffe
  210.     dc.w    $180,$001    ; Color0
  211.  
  212.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  213.  
  214. ;    figura
  215.  
  216.     dcb.b    40*98,0        ; spazio azzerato
  217.  
  218. PIC:
  219.     incbin    "amiga.320*256*3"    ; qua carichiamo la figura in RAW,
  220.                     ; convertita col KEFCON, fatta di
  221.                     ; 3 bitplanes consecutivi
  222.  
  223.     dcb.b    40*30,0        ; spazio azzerato
  224.  
  225.     end
  226.  
  227. cambiando la sola copperlist dell'esempio Lezione5c.s si e' potuto ottenere
  228. questo effetto di "avvolgimento della figura su un cilindro", che non e' poi
  229. molto convincente, ma almeno e' molto facile e veloce da fare, infatti basta
  230. mettere i $dff102 in ordine progressivo nei wait: 1,2,3,4 per creare la prima
  231. distorsione verso destra:
  232.  
  233.     +++++++++++++
  234.      +++++++++++++
  235.       +++++++++++++
  236.        +++++++++++++
  237.  
  238. poi raggiunta la meta' basta calare di uno ogni volta fino a tornare a zero.
  239.  
  240.